package principal;

import hibernate.util.HibernateUtil;

import java.util.Collection;
import java.util.List;
import java.util.Scanner;

import javax.management.Query;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateAccessor;

import negocio.basica.Endereco;
import negocio.basica.Usuario;

public class TelaUsuario {
	
	private String nome;
	private String rg;
	private String cpf;
	private String email;
	private String login;
	private String senha;
	private Endereco endereco;
	
	public void exibirTelaUsuario() {
		int op = 1;

		Scanner leitor = new Scanner(System.in);

		while (op != 0) {

			System.out.println("===============================");
			System.out.println("Usuário");
			System.out.println("===============================");
			System.out.println("1 - Cadastrar");
			System.out.println("2 - Excluir");
			System.out.println("3 - Alterar");
			System.out.println("4 - Listar");
			System.out.println("0 - Sair");
			System.out.println("Opção: ");
			op = leitor.nextInt();
			
			switch (op) {
			case 1:
				exibirTelaCadastro();
				break;
			case 2:
				exibirTelaExclusao();				
				break;
			case 3:
				exibirTelaEditar();				
				break;
			case 4:
				listarUsario();				
				break;			
			default:
				break;
			}
		}
	}
	
	private void listarUsario() {
		Collection<Usuario> lista = listaTodos();
		for (Usuario usuario : lista) {
			System.out.println("--------- usuario: "+usuario.getUsurNome()+"\n");
		}
	}

	private void exibirTelaEditar() {
		Scanner leitor = new Scanner(System.in);
		Usuario usuario = new Usuario();
		
		System.out.println("===============================");
		System.out.println("Editar Usuário");
		System.out.println("===============================");
		System.out.println("\n");
		
		System.out.println("Informe o CPF: ");
		this.setCpf(leitor.nextLine());
		usuario.setUsurDscpf(this.getCpf());
				
		editarUsuario(usuario.getUsurDscpf());
	}

	private void editarUsuario(String cpf) {
		Scanner leitor = new Scanner(System.in);
		String escolha = "";

		Usuario usuarioAlterado = null;
		
		try{
			if (cpf != null && !cpf.equals(null)){
				String  query = "FROM usu.usurDscpf Usuario usu WHERE usu.usurDscpf = :cpf";
				Session sessao = HibernateUtil.getSession();
				
				usuarioAlterado = (Usuario) sessao.createQuery(query)
				.setString("cpf", cpf)
				.uniqueResult();
				
				sessao.delete(usuarioAlterado);
			} 
			
		     System.out.println("O nome atual é " + usuarioAlterado.getUsurNome() + "\n");		
				System.out.println("Informe o novo nome: ");
				this.setNome(leitor.next());
				
				System.out.println("O RG atual é " + usuarioAlterado.getUsurDsrg() + "\n");
				System.out.println("Informe o novo RG: ");
				this.setRg(leitor.next());
				
				System.out.println("O CPF atual é " + usuarioAlterado.getUsurDscpf() + "\n");
				System.out.println("Informe o novo CPF: ");
				this.setCpf(leitor.next());
				
				System.out.println("O e-mail atual é " + usuarioAlterado.getUsurDsemail()+ "\n");
				System.out.println("Informe o novo E-mail: ");
				this.setEmail(leitor.next());
				
				System.out.println("O Login atual é " + usuarioAlterado.getUsurDslogin() + "\n");
				System.out.println("Informe o novo Login: ");
				this.setLogin(leitor.next());
				
				System.out.println("A Senha atual é " + usuarioAlterado.getUsurDssenha() + "\n");
				System.out.println("Informe a nova Senha: ");
				this.setSenha(leitor.next());
				
				System.out.println("Salvar [Sim/Não]: ");
				escolha = leitor.next();
				
				if (escolha.equals("sim")){
					
					usuarioAlterado.setUsurNome(this.getNome());
					usuarioAlterado.setUsurDsrg(this.getRg());
					usuarioAlterado.setUsurDscpf(this.getCpf());
					usuarioAlterado.setUsurDsemail(this.getEmail());
					usuarioAlterado.setUsurDslogin(this.getLogin());
					usuarioAlterado.setUsurDssenha(this.getSenha());
					
					HibernateUtil.getSession().update(usuarioAlterado);
				}		

		}  
		catch (Exception e)  
		{  
		   System.out.println("CPF informado invalido...");  
		}		
	}
	
	public Collection<Usuario> listaTodos(){  
		Collection<Usuario> lista = null;  
	    try{  
	    	lista = HibernateUtil.getSession().createCriteria(Usuario.class).list();
			  
	    } catch(Exception ex){  
	        System.out.println("Erro ao listar");  
	    }  
	    return lista;  
	}  

	private void exibirTelaExclusao() {
		Scanner leitor = new Scanner(System.in);
		Usuario usuario = new Usuario();
		
		String escolha = "";
		
		System.out.println("===============================");
		System.out.println("Excluir Usuário");
		System.out.println("===============================");
		System.out.println("\n");
		
		System.out.println("Informe o CPF: ");
		this.setCpf(leitor.nextLine());
		usuario.setUsurDscpf(this.getCpf());
		
		System.out.println("Salvar [Sim/Não]: ");
		escolha = leitor.next();
		
		if (escolha.equals("sim")){
			ExcluirUsuario(usuario);
		}		
	}

	private void ExcluirUsuario(Usuario usuario) {
		
		if (usuario.getUsurDscpf() != null){
			String  query = "FROM usu.usurDscpf Usuario usu WHERE usu.usurDscpf = :cpf";
			Usuario usuarioExcluido = null;
			Session sessao = HibernateUtil.getSession();
			
			String cpf = usuario.getUsurDscpf();
			
			usuarioExcluido = (Usuario) sessao.createQuery(query)
			.setString("cpf", cpf)
			.uniqueResult();
			
			sessao.delete(usuarioExcluido);
		}
	}

	public void exibirTelaCadastro(){
		Scanner leitor = new Scanner(System.in);
		
		String escolha = "";
		
		System.out.println("===============================");
		System.out.println("Cadastrar Usuário");
		System.out.println("===============================");
		System.out.println("\n");
		
		System.out.println("Informe o nome: ");
		this.setNome(leitor.next());
		System.out.println("Informe o RG: ");
		this.setRg(leitor.next());
		System.out.println("Informe o CPF: ");
		this.setCpf(leitor.next());
		System.out.println("Informe o E-mail: ");
		this.setEmail(leitor.next());
		System.out.println("Informe o Login: ");
		this.setLogin(leitor.next());
		System.out.println("Informe a Senha: ");
		this.setSenha(leitor.next());
		
		TelaEndereco telaEndereco = new TelaEndereco();
		this.setEndereco(telaEndereco.exibirTelaEndereco());
		
		System.out.println("Salvar [Sim/Não]: ");
		escolha = leitor.next();
		
		if (escolha.equals("sim")){
			inserirUsuario();
		}
	}

	public void inserirUsuario(){
		Usuario usuario = new Usuario();
		usuario.setUsurNome(this.getNome());
		usuario.setUsurDsrg(this.getRg());
		usuario.setUsurDscpf(this.getCpf());
		usuario.setUsurDsemail(this.getEmail());
		usuario.setUsurDslogin(this.getLogin());
		usuario.setUsurDssenha(this.getSenha());
		HibernateUtil.beginTransaction();
		HibernateUtil.getSession().save(usuario);
		HibernateUtil.commitTransaction();
	}
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getLogin() {
		return login;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}
	
	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
}
